from typing import Optional

from fastapi import APIRouter, Form, UploadFile, File
from fastapi import Body
from pydantic import BaseModel
# from starlette.routing import BaseRoute

# base_route = BaseRoute()
# 这个tags只是一个名字，辅助说明一下。prefix才是路由前缀
router = APIRouter(prefix='/user', tags=['user'])


# 这是请求输入参数
class User(BaseModel):
    name: str
    age: int
    salary: Optional[float] = None  # 可选值要赋值None，否则请求会报错


# 这是响应参数
class UserReply:
    message: str
    code: int
    salary: Optional[float]


@router.get('/list')
def user_list():
    """查询用户列表，这个注释也会出现在swagger中"""
    reply = UserReply()
    reply.message = 'OK'
    reply.code = 200
    return reply


@router.post('/add')
# def user_add(user: User = Body(...)):
def user_add(user: User):  # 后面的Body不需要，也是可以的
    print(user.name)
    # 使用POJO 作为返回值是OK的
    # reply = UserReply()
    # reply.message = 'OK'
    # reply.code = 200
    # 这是表单验证参数类（用于入参），直接new会出错，要在构造函数中，对必须值进行赋值。或者使用POJO对象
    reply = User(name='尹雷', age=38)
    # reply.name = '尹雷'
    # reply.age = 38
    # reply.salary = 38000
    return reply


# 这是表单，键值对提交参数。只能一个个的接收参数，不能使用model接收参数。model好像要使用json格式提交参数
# = Form(...)，必须是这样，否则接受不到参数
@router.post('/update')
def user_update(name: str = Form(...), age: float = Form(...)):
    print(name)
    reply = UserReply()
    reply.message = 'OK'
    reply.code = 200
    return reply


# 上传文件
@router.post("/upload/")
async def upload_file(file: UploadFile = File(...)):  # 这个参数名 file要和前端是对应的
    # 这里你可以处理上传的文件，比如保存到磁盘或进行其他操作
    contents = await file.read()
    with open(file.filename, "wb") as f:
        # f.write(contents)
        pass
    return {"filename": file.filename}
